package service

import (
	"errors"
	"wms/internal/model"
	"wms/pkg/global"

	"gorm.io/gorm"
)

// UnitService 单位服务
type UnitService struct {
	db *gorm.DB
}

// NewUnitService 创建单位服务
func NewUnitService() *UnitService {
	return &UnitService{
		db: global.DB,
	}
}

// CreateUnit 创建单位
func (s *UnitService) CreateUnit(unit *model.Unit) error {
	// 检查单位编码是否已存在
	var count int64
	if err := s.db.Model(&model.Unit{}).Where("code = ?", unit.Code).Count(&count).Error; err != nil {
		return err
	}
	if count > 0 {
		return errors.New("单位编码已存在")
	}

	// 检查单位名称是否已存在
	if err := s.db.Model(&model.Unit{}).Where("name = ?", unit.Name).Count(&count).Error; err != nil {
		return err
	}
	if count > 0 {
		return errors.New("单位名称已存在")
	}

	return s.db.Create(unit).Error
}

// UpdateUnit 更新单位
func (s *UnitService) UpdateUnit(unit *model.Unit) error {
	// 检查单位是否存在
	var existingUnit model.Unit
	if err := s.db.First(&existingUnit, unit.ID).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return errors.New("单位不存在")
		}
		return err
	}

	// 检查单位编码是否重复
	if unit.Code != existingUnit.Code {
		var count int64
		if err := s.db.Model(&model.Unit{}).Where("code = ? AND id != ?", unit.Code, unit.ID).Count(&count).Error; err != nil {
			return err
		}
		if count > 0 {
			return errors.New("单位编码已存在")
		}
	}

	// 检查单位名称是否重复
	if unit.Name != existingUnit.Name {
		var count int64
		if err := s.db.Model(&model.Unit{}).Where("name = ? AND id != ?", unit.Name, unit.ID).Count(&count).Error; err != nil {
			return err
		}
		if count > 0 {
			return errors.New("单位名称已存在")
		}
	}

	return s.db.Model(&existingUnit).Updates(map[string]interface{}{
		"name":   unit.Name,
		"code":   unit.Code,
		"status": unit.Status,
		"remark": unit.Remark,
	}).Error
}

// DeleteUnit 删除单位
func (s *UnitService) DeleteUnit(id uint) error {
	// 检查单位是否存在
	var unit model.Unit
	if err := s.db.First(&unit, id).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return errors.New("单位不存在")
		}
		return err
	}

	// 检查单位是否被引用
	var count int64

	// 检查是否被货物引用
	if err := s.db.Model(&model.Cargo{}).Where("unit = ?", unit.Name).Count(&count).Error; err != nil {
		return err
	}
	if count > 0 {
		return errors.New("单位正在被货物使用，无法删除")
	}

	return s.db.Delete(&unit).Error
}

// GetUnit 获取单位详情
func (s *UnitService) GetUnit(id uint) (*model.Unit, error) {
	var unit model.Unit
	if err := s.db.First(&unit, id).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("单位不存在")
		}
		return nil, err
	}
	return &unit, nil
}

// ListUnits 获取单位列表
func (s *UnitService) ListUnits(keyword string, status int) ([]*model.Unit, error) {
	var units []*model.Unit
	db := s.db.Model(&model.Unit{})

	// 添加查询条件
	if keyword != "" {
		db = db.Where("name LIKE ? OR code LIKE ?", "%"+keyword+"%", "%"+keyword+"%")
	}
	if status > 0 {
		db = db.Where("status = ?", status)
	}

	// 按名称排序
	db = db.Order("name ASC")

	if err := db.Find(&units).Error; err != nil {
		return nil, err
	}

	return units, nil
} 